package fr.afcepf.ai89.esharing.data;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import fr.afcepf.ai89.esharing.entity.Administrateur;
import fr.afcepf.ai89.esharing.entity.Civilite;
import fr.afcepf.ai89.esharing.entity.FrCodePostalAsso;
import fr.afcepf.ai89.esharing.entity.FrCodePostalAssoPK;
import fr.afcepf.ai89.esharing.entity.FrCommune;
import fr.afcepf.ai89.esharing.entity.FrCommunePK;
import fr.afcepf.ai89.esharing.entity.FrDepartement;
import fr.afcepf.ai89.esharing.entity.FrNoTel;
import fr.afcepf.ai89.esharing.entity.FrRegion;
import fr.afcepf.ai89.esharing.entity.Proprietaire;
import fr.afcepf.ai89.esharing.entity.Valeur;

@Stateless
public class DAOProprietaire implements IDAOProprietaire {

	@PersistenceContext(unitName = "ESharingPhase22")
	EntityManager em;
	
	@Override
	public Proprietaire getProp(int idProp) {
		Query hql = em.createQuery("SELECT p FROM Proprietaire p LEFT JOIN p.aems a LEFT JOIN p.imgProprietaires " 
				+ "WHERE p.idUtilisateur = :paramProp" );
				
		hql.setParameter("paramProp", idProp);
		Proprietaire ficheProprietaire = (Proprietaire)hql.getSingleResult();
		return ficheProprietaire;
	}

	@Override
	public List<Proprietaire> getProps() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Proprietaire> getProps(FrRegion region) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Proprietaire> getProps(FrDepartement dept) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Proprietaire> getProps(FrCommune commune) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Proprietaire> getProps(int codePostal) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int inscrire(Proprietaire prop) {
		em.persist(prop);
		Query hql = em.createQuery("SELECT max(idUtilisateur) FROM Proprietaire");
		int idUtilisateur = (Integer) hql.getSingleResult();
		return idUtilisateur;	
	}

	@Override
	public int majInfosPersos(Proprietaire prop) {
		
		Proprietaire propMaj = em.find(Proprietaire.class, prop.getIdUtilisateur());
		propMaj.setAdministrateur(prop.getAdministrateur());
		propMaj.setAems(prop.getAems());
		propMaj.setAutobiographie(prop.getAutobiographie());
		propMaj.setCivilite(prop.getCivilite());
		propMaj.setNom(prop.getNom());
		propMaj.setPrenom(prop.getPrenom());
		propMaj.setNomUtilisateur(prop.getNomUtilisateur());
		propMaj.setMotPasse(prop.getMotPasse());
		propMaj.setCourriel(prop.getCourriel());
		propMaj.setDateInsciption(prop.getDateInsciption());
		propMaj.setDateNaissance(prop.getDateNaissance());
		propMaj.setFrNoTel1(prop.getFrNoTel1());
		propMaj.setFrCodePostalCommune(prop.getFrCodePostalCommune());
		
		em.merge(propMaj);
		
		Query hql = em.createQuery("SELECT p FROM Proprietaire p WHERE p.idUtilisateur = :param");
		hql.setParameter("param", propMaj.getIdUtilisateur());
		Proprietaire leFil  = (Proprietaire)hql.getSingleResult();
		return leFil.getIdUtilisateur();
		
	}

	@Override
	public int accepterParrainage(Proprietaire filleul) {
		
		Proprietaire propMaj = em.find(Proprietaire.class, filleul.getIdUtilisateur());
		propMaj.setAdministrateur(filleul.getAdministrateur());
		propMaj.setAems(filleul.getAems());
		propMaj.setAutobiographie(filleul.getAutobiographie());
		propMaj.setCivilite(filleul.getCivilite());
		propMaj.setNom(filleul.getNom());
		propMaj.setPrenom(filleul.getPrenom());
		propMaj.setNomUtilisateur(filleul.getNomUtilisateur());
		propMaj.setMotPasse(filleul.getMotPasse());
		propMaj.setCourriel(filleul.getCourriel());
		propMaj.setDateInsciption(filleul.getDateInsciption());
		propMaj.setDateNaissance(filleul.getDateNaissance());
		propMaj.setFrNoTel1(filleul.getFrNoTel1());
		propMaj.setFrCodePostalCommune(filleul.getFrCodePostalCommune());
		
		em.merge(propMaj);
		
		Query hql = em.createQuery("SELECT p FROM Proprietaire p WHERE p.idUtilisateur = :param");
		hql.setParameter("param", propMaj.getIdUtilisateur());
		Proprietaire leFil  = (Proprietaire)hql.getSingleResult();
		return leFil.getIdUtilisateur();
		
	}

	@Override
	public int compteDesactiver(Proprietaire prop) {

		Proprietaire propMaj = em.find(Proprietaire.class, prop.getIdUtilisateur());
		propMaj.setDateDepart(new Date());
		em.merge(propMaj);
		
		Query hql = em.createQuery("SELECT p FROM Proprietaire p WHERE p.idUtilisateur = :param");
		hql.setParameter("param", propMaj.getIdUtilisateur());
		Proprietaire leDes  = (Proprietaire)hql.getSingleResult();
		return leDes.getIdUtilisateur();
		
	}

	@Override
	public int reactiverCompte(Proprietaire prop) {

		Proprietaire propMaj = em.find(Proprietaire.class, prop.getIdUtilisateur());
		propMaj.setDateDepart(null);
		em.merge(propMaj);
		
		Query hql = em.createQuery("SELECT p FROM Proprietaire p WHERE p.idUtilisateur = :param");
		hql.setParameter("param", propMaj.getIdUtilisateur());
		Proprietaire leRevenu  = (Proprietaire)hql.getSingleResult();
		return leRevenu.getIdUtilisateur();
		
	}

	@Override
	public int parrainer(Proprietaire filleul) {
		
		filleul.setCivilite(new Civilite());
		filleul.getCivilite().setIdCivilite(1);
		filleul.setNomUtilisateur("nomFilleul");
		filleul.setMotPasse("mpFilleul");
		filleul.setFrNoTel1(new FrNoTel());
		filleul.getFrNoTel1().setNoTelFr(900000000);
		filleul.setPrenom("Prénom");
		filleul.setNom("Nom");
		filleul.setNomRue("Rue");
		filleul.setNoVoie(0);
		filleul.setDateNaissance(new Date(70, 12, 1));
		filleul.setDateInsciption(new Date());
		
		FrCodePostalAsso frCP = new FrCodePostalAsso();
		
			FrCodePostalAssoPK cpPK = new FrCodePostalAssoPK();
			
			FrCommune frC = new FrCommune(); //préciser laquelle
				FrCommunePK frcPK = new FrCommunePK();
				frcPK.setIdDepartement("75");
				frcPK.setCodeCommune(56);
				frC.setId(frcPK);
		
			cpPK.setCodeCommune(frC.getId().getCodeCommune());
			cpPK.setIdDeptCom(frC.getId().getIdDepartement());
			
			frCP.setId(cpPK);
			cpPK.setCodePostal(75001); //préciser laquelle
			frCP.setFrCommune(frC);
		filleul.setFrCodePostalCommune(frCP);
		filleul.setAdministrateur(new Administrateur());
		filleul.getAdministrateur().setIdEmploye(1);
		String autobiographie = "ERR 001 : non validé";
		filleul.setAutobiographie(autobiographie);

		em.persist(filleul);
		
		Query hql = em.createQuery("SELECT max(idUtilisateur) FROM Proprietaire");
		int idUtilisateur = (Integer) hql.getSingleResult();
		
		return idUtilisateur;	

	}
	
	@Override
	public int login(String nom, String mdp) {
		
		Query hql = em.createQuery("SELECT MAX(idUtilisateur) FROM Proprietaire p WHERE p.nomUtilisateur = :param1 AND p.motPasse = :param2");
		hql.setParameter("param1", nom);
		hql.setParameter("param2", mdp);
		Integer idUtilisateur = (Integer) hql.getSingleResult();
		
		int pourRetour = -1;
		
		if (idUtilisateur != null && idUtilisateur > 0) {
			
			pourRetour = idUtilisateur;
			
		}
		
		return pourRetour;
		
	}


}
